package com.cotasul.persistencia;

import java.sql.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import com.cotasul.bean.CompradorBean;
import com.cotasul.bean.CotacaoBean;
import com.cotasul.bean.FormaPagamentoBean;
import com.cotasul.bean.FornecedorBean;
import com.cotasul.bean.ItemOrcamentoBean;
import com.cotasul.bean.OrcamentoBean;
import com.cotasul.bean.ProdutoBean;
import com.cotasul.bean.TipoBean;
import com.cotasul.bean.UsuarioBean;
import com.cotasul.negocio.FornecedorServico;
import com.cotasul.negocio.excecoes.EmailException;
import com.cotasul.persistencia.config.GerenciadorConexao;
import com.cotasul.persistencia.config.SQLConfiguracao;
import com.cotasul.persistencia.enums.EnumCondicao;
import com.cotasul.persistencia.interfaces.IOrcamentoDao;
import com.cotasul.util.Ferramentas;

public class OrcamentoDao<P extends OrcamentoBean> extends DaoGenerico<P>
		implements IOrcamentoDao<P> {

	private SimpleDateFormat dataFormat;

	public OrcamentoDao() {
		dataFormat = new SimpleDateFormat("yyyyMMdd");
	}

	@Override
	public void alterar(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Map<String, Long> salvar(P p) throws Exception {
		long codOrca = 0;
		long codItemOrca = 0;
		FornecedorServico<FornecedorBean> fornecedorServico = new FornecedorServico<FornecedorBean>();
		List<FornecedorBean> fornecedores = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_orcamento");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				codOrca = rs.getLong("MAXCOD");
			}
			query = SQLConfiguracao.getInstance().getValor("insere_orcamento");
			ps = conn.prepareStatement(query);
			ps.setLong(1, codOrca);
			ps.setLong(2, p.getComprador().getCodigo());
			ps.setDate(3, new Date(p.getDataEmissao().getTime()));
			ps.setDate(4, new Date(p.getDataValidade().getTime()));
			ps.setString(5, p.getStatus());
			ps.execute();
			conn.commit();
			query = SQLConfiguracao.getInstance().getValor("localiza_max_item");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				codItemOrca = rs.getLong("MAXCOD");
			}
			query = SQLConfiguracao.getInstance().getValor(
					"insere_item_orcamento");
			for (int i = 0; i < p.getItensOrcamento().size(); i++) {
				ps = conn.prepareStatement(query);
				ps.setLong(1, codItemOrca);
				ps.setLong(2, codOrca);
				ps.setLong(3, p.getItensOrcamento().get(i).getProduto()
						.getCodigo());
				ps.setDouble(4, p.getItensOrcamento().get(i).getValorUnitario());
				ps.setDouble(5, p.getItensOrcamento().get(i).getQuantidade());
				ps.setLong(6, p.getItensOrcamento().get(i).getTipo()
						.getCodigo());
				ps.execute();
				conn.commit();
				codItemOrca += 1;

			}
			Collections.sort(p.getItensOrcamento());
			Map<Long, List<String>> tipos;
			tipos = new HashMap<Long, List<String>>();
			List<String> produtos = new ArrayList<String>();
			for (int i = 0; i < p.getItensOrcamento().size(); i++) {
				String produto = p.getItensOrcamento().get(i).getProduto()
						.getDescricao();
				if (i == 0) {
					produtos.add(produto);
				} else {
					if (p.getItensOrcamento().get(i - 1).getTipo().getCodigo() == p
							.getItensOrcamento().get(i).getTipo().getCodigo()) {
						produtos.add(produto);
					} else {
						tipos.put(p.getItensOrcamento().get(i - 1).getTipo()
								.getCodigo(), produtos);
						produtos = new ArrayList<String>();
						produtos.add(produto);
					}
				}
				if (p.getItensOrcamento().size() == i + 1) {
					tipos.put(p.getItensOrcamento().get(i).getTipo()
							.getCodigo(), produtos);
				}
			}

			if (tipos.size() > 0) {
				Set<Entry<Long, List<String>>> set = tipos.entrySet();
				Iterator<Entry<Long, List<String>>> it = set.iterator();
				String msg = "Você acaba de receber uma nova cotação.";

				while (it.hasNext()) {
					Map.Entry<Long, List<String>> m = (Entry<Long, List<String>>) it
							.next();
					long tipo = m.getKey();
					fornecedores = null;
					fornecedores = fornecedorServico.buscaFornecedorTipo(tipo);
					// String produtosConcat = "";
					for (FornecedorBean fornecedor : fornecedores) {
						// for (String produto : m.getValue()) {
						// produtosConcat += produto;
						// }
						Ferramentas.enviaEmail(msg, "Nova Cotação",
								fornecedor.getEmail());
					}
				}
			}
		} catch (EmailException e1) {
			conn.rollback();
			throw e1;
		} catch (Exception e2) {
			conn.rollback();
			throw e2;
		} finally {
			super.fecharRecursos(ps, rs);
		}
		Map<String, Long> retorno = new HashMap<String, Long>();
		retorno.put("", codOrca);
		return retorno;
	}

	@SuppressWarnings("unchecked")
	public List<P> filtraOrcamento(P p, CompradorBean comprador)
			throws Exception {

		List<OrcamentoBean> listaOrcamentos = null;
		ItemOrcamentoBean itemOrcamento = null;
		OrcamentoBean orcamento = null;
		ProdutoBean produto = null;
		TipoBean tipo = null;
		List<ItemOrcamentoBean> itensOrcamento = null;
		ResultSet rs2;
		FornecedorBean fornecedor = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_orcamentos_comprador");
			if (p.getDataEmissao() != null && !"".equals(p.getDataEmissao())) {
				query += " AND DTEMISSAO >= '"
						+ dataFormat.format(p.getDataEmissao()) + "'";
			}
			if (p.getDataValidade() != null && !"".equals(p.getDataValidade())) {
				query += " AND DTEMISSAO <= '"
						+ dataFormat.format(p.getDataValidade()) + "'";
			}
			if (p.getNumero() != null && p.getNumero() != 0) {
				query += " AND orcamentos.IDORCA = '" + p.getNumero() + "'";
			}
			query += " AND orcamentos.STATUS = '" + p.getStatus().trim() + "'";
			query += " ORDER BY DTVALIDADE";
			ps = conn.prepareStatement(query);
			ps.setLong(1, comprador.getCodigo());
			rs = ps.executeQuery();
			listaOrcamentos = new ArrayList<OrcamentoBean>();
			while (rs.next()) {
				itensOrcamento = new ArrayList<ItemOrcamentoBean>();
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_itens_comprador");
				ps = conn.prepareStatement(query);
				ps.setLong(1, comprador.getCodigo());
				ps.setLong(2, rs.getLong("IDORCA"));
				rs2 = ps.executeQuery();
				while (rs2.next()) {
					produto = new ProdutoBean();
					tipo = new TipoBean();
					itemOrcamento = new ItemOrcamentoBean();
					produto.setCodigo(rs2.getLong("IDPROD"));
					produto.setDescricao(rs2.getString("DESCRICAO"));
					produto.setUnidadeMedida(rs2.getString("UNIMEDIDA"));
					produto.setImagemProd(rs2.getBytes("IMAGEMPROD"));
					produto.setMarca(rs2.getString("MARCA_PROD"));
					tipo.setCodigo(rs2.getLong("IDTIPO"));
					tipo.setDescricao(rs2.getString("TIPODESC"));
					itemOrcamento.setNumero(rs2.getLong("IDITE"));
					itemOrcamento.setProduto(produto);
					itemOrcamento.setQuantidade(rs2.getDouble("QUANTIDADE"));
					itemOrcamento.setTipo(tipo);
					itemOrcamento.setValorUnitario(rs2.getDouble("VALORUNI"));
					itemOrcamento.setValorTotal(itemOrcamento.getQuantidade()
							* itemOrcamento.getValorUnitario());
					if (rs2.getLong("IDFORNAPRO") != 0) {
						fornecedor = new FornecedorBean();
						fornecedor.setCodigo(rs2.getLong("IDFORN"));
						fornecedor.setNome(rs2.getString("RAZAO"));
						fornecedor.setContato(rs2.getString("CONTATO"));
						itemOrcamento.setForneceApro(fornecedor);
					}
					itensOrcamento.add(itemOrcamento);

				}
				orcamento = new OrcamentoBean();
				comprador.setCnpj(rs.getString("CNPJ"));
				comprador.setCodigo(rs.getLong("IDCOMP"));
				comprador.setContato(rs.getString("CONTATO"));
				comprador.setEmail(rs.getString("EMAIL"));
				comprador.setFone(rs.getString("FONE"));
				comprador.setFone2(rs.getString("FONE2"));
				comprador.setNome(rs.getString("RAZAO"));
				orcamento.setComprador(comprador);
				orcamento.setDataEmissao(rs.getDate("DTEMISSAO"));
				orcamento.setDataValidade(rs.getDate("DTVALIDADE"));
				orcamento.setItensOrcamento(itensOrcamento);
				orcamento.setNumero(rs.getLong("IDORCA"));
				orcamento.setStatus(rs.getString("STATUS"));
				listaOrcamentos.add(orcamento);
			}

		} catch (Exception e) {
			throw e;
		}

		return (List<P>) listaOrcamentos;

	};

	@SuppressWarnings("unchecked")
	public List<P> filtraOrcamentoFornecedor(P p, FornecedorBean fornecedor)
			throws Exception {

		List<OrcamentoBean> listaOrcamentos = null;
		ItemOrcamentoBean itemOrcamento = null;
		OrcamentoBean orcamento = null;
		CompradorBean comprador = null;
		ProdutoBean produto = null;
		TipoBean tipo = null;
		UsuarioBean usuario = null;
		List<ItemOrcamentoBean> itensOrcamento = null;
		ResultSet rs2;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_orcamentos_fornecedor");
			if (p.getDataEmissao() != null && !"".equals(p.getDataEmissao())) {
				query += " AND DTEMISSAO >= '"
						+ dataFormat.format(p.getDataEmissao()) + "'";
			}
			if (p.getDataValidade() != null && !"".equals(p.getDataValidade())) {
				query += " AND DTEMISSAO <= '"
						+ dataFormat.format(p.getDataValidade()) + "'";
			}
			if (p.getNumero() != null && p.getNumero() != 0) {
				query += " AND orcamentos.IDORCA = '" + p.getNumero() + "'";
			}
			query += " ORDER BY IDORCA";
			ps = conn.prepareStatement(query);
			ps.setLong(1, fornecedor.getTipo().getCodigo());
			rs = ps.executeQuery();

			listaOrcamentos = new ArrayList<OrcamentoBean>();
			while (rs.next()) {
				itensOrcamento = new ArrayList<ItemOrcamentoBean>();
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_itens_fornecedor");
				ps = conn.prepareStatement(query);
				ps.setLong(1, rs.getLong("IDORCA"));
				ps.setLong(2, fornecedor.getTipo().getCodigo());
				rs2 = ps.executeQuery();
				while (rs2.next()) {
					produto = new ProdutoBean();
					tipo = new TipoBean();
					itemOrcamento = new ItemOrcamentoBean();
					produto.setCodigo(rs2.getLong("IDPROD"));
					produto.setDescricao(rs2.getString("DESCRICAO"));
					produto.setUnidadeMedida(rs2.getString("UNIMEDIDA"));
					produto.setImagemProd(rs2.getBytes("IMAGEMPROD"));
					produto.setMarca(rs2.getString("MARCA_PROD"));
					tipo.setCodigo(rs2.getLong("IDTIPO"));
					tipo.setDescricao(rs2.getString("TIPODESC"));
					itemOrcamento.setNumero(rs2.getLong("IDITE"));
					itemOrcamento.setProduto(produto);
					itemOrcamento.setQuantidade(rs2.getDouble("QUANTIDADE"));
					itemOrcamento.setTipo(tipo);
					itensOrcamento.add(itemOrcamento);
				}
				orcamento = new OrcamentoBean();
				comprador = new CompradorBean();
				usuario = new UsuarioBean();
				usuario.setEndereco(rs.getString("ENDERECO"));
				usuario.setUf(rs.getString("UF"));
				usuario.setCidade(rs.getString("CIDADE"));
				comprador.setCnpj(rs.getString("CNPJ"));
				comprador.setCodigo(rs.getLong("IDCOMP"));
				comprador.setContato(rs.getString("CONTATO"));
				comprador.setEmail(rs.getString("EMAIL"));
				comprador.setFone(rs.getString("FONE"));
				comprador.setFone2(rs.getString("FONE2"));
				comprador.setNome(rs.getString("RAZAO"));
				comprador.setUsuario(usuario);
				orcamento.setComprador(comprador);
				orcamento.setDataEmissao(rs.getDate("DTEMISSAO"));
				orcamento.setDataValidade(rs.getDate("DTVALIDADE"));
				orcamento.setItensOrcamento(itensOrcamento);
				orcamento.setNumero(rs.getLong("IDORCA"));
				listaOrcamentos.add(orcamento);
			}

		} catch (Exception e) {
			throw e;
		}

		return (List<P>) listaOrcamentos;

	};

	@Override
	public void exluir(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void preSalvar(P p) {
		// TODO Auto-generated method stub

	}

	@SuppressWarnings("unchecked")
	public List<P> buscaOrcamentos(Map<String, String> param) throws Exception {

		List<CotacaoBean> listaCotacoes = null;
		CotacaoBean cotacao = null;
		ProdutoBean produto = null;
		OrcamentoBean orcamento = null;
		ItemOrcamentoBean itemOrcamento = null;
		List<OrcamentoBean> listaOrcamento = new ArrayList<OrcamentoBean>();
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_cotacoes_2");
			if (param.get("CODPROD") != null) {
				query += " AND I.IDPROD = ?";
			}
			if (param.get("DESCPROD") != null) {
				query += " AND P.DESCRICAO LIKE ?";
			}
			if (param.get("DATADE") != null) {
				query += " AND O.DTEMISSAO >= ?";
			}
			if (param.get("DATAATE") != null) {
				query += " AND O.DTEMISSAO <= ?";
			}
			if (param.get("NUMORCADE") != null) {
				query += " AND O.IDORCA >= ?";
			}
			if (param.get("NUMORCAATE") != null) {
				query += " AND O.IDORCA <= ?";
			}
			if (param.get("STATUS") != null
					&& "APROVADO".equals(param.get("STATUS"))) {
				query += " AND I.IDFORNAPRO IS NOT NULL";
				query += " AND F.IDFORN = I.IDFORNAPRO ";
			}
			if (param.get("STATUS") != null
					&& "ABERTO".equals(param.get("STATUS"))) {
				query += " AND I.IDFORNAPRO IS NULL";
			}
			if (param.get("STATUS") != null
					&& "ENCERRADO".equals(param.get("STATUS"))) {
				query += " AND I.IDFORNAPRO IS NOT NULL";
				query += " AND F.IDFORN <> I.IDFORNAPRO ";
			}
			query += " ORDER BY O.IDORCA";
			ps = conn.prepareStatement(query, ResultSet.CONCUR_UPDATABLE);
			ps.setLong(psIndex++, Long.parseLong(param.get("CODUSER")));
			if (param.get("CODPROD") != null) {
				ps.setLong(psIndex++, Long.parseLong(param.get("CODPROD")));
			}
			if (param.get("DESCPROD") != null) {
				ps.setString(psIndex++, param.get("DESCPROD"));
			}
			if (param.get("DATADE") != null) {
				ps.setDate(
						psIndex++,
						new Date(Ferramentas.formataData(param.get("DATADE"),
								"dd/MM/yy").getTime()));
			}
			if (param.get("DATAATE") != null) {
				ps.setDate(
						psIndex++,
						new Date(Ferramentas.formataData(param.get("DATAATE"),
								"dd/MM/yy").getTime()));
			}
			if (param.get("NUMORCADE") != null) {
				ps.setLong(psIndex++, Long.parseLong(param.get("NUMORCADE")));
			}
			if (param.get("NUMORCAATE") != null) {
				ps.setLong(psIndex++, Long.parseLong(param.get("NUMORCAATE")));
			}

			rs = ps.executeQuery();
			long idOrca = 0;
			while (rs.next()) {
				if (idOrca != rs.getLong("IDORCA")) {
					if (idOrca != 0) {
						orcamento.setCotacoes(listaCotacoes);
						listaOrcamento.add(orcamento);
					}
					orcamento = new OrcamentoBean();
					orcamento.setNumero(rs.getLong("IDORCA"));
					orcamento.setComprador(new CompradorBean(rs
							.getString("RAZAO"), null));
					orcamento.setDataEmissao(rs.getDate("DTEMISSAO"));
					orcamento.setDataValidade(rs.getDate("DTVALIDADE"));

					if (rs.getString("STATUS") != null
							&& rs.getString("STATUS").trim().equals("Aberto")) {
						orcamento.setStatus(rs.getString("STATUS").trim());
					} else if (rs.getString("STATUS") != null
							&& rs.getString("STATUS").trim()
									.equals("Encerrado")
							&& rs.getLong("IDFORN") != rs.getLong("IDFORNAPRO")) {
						orcamento.setStatus("Encerrado");
					} else {
						orcamento.setStatus("Aprovado");
					}

					idOrca = rs.getLong("IDORCA");
					listaCotacoes = new ArrayList<CotacaoBean>();
				}

				cotacao = new CotacaoBean();
				cotacao.setCodigo(rs.getLong("IDCOTA"));
				cotacao.setFormaPagamento(new FormaPagamentoBean(rs
						.getString("METODO_PAGAMENTO"), rs
						.getString("FORMA_PAGAMENTO")));
				cotacao.setPrazoEntrega(rs.getString("PRAZO_ENTREGA"));
				cotacao.setTipoFrete(rs.getString("TIPO_FRETE"));
				cotacao.setValorUnitario(rs.getDouble("VALORUNI"));
				cotacao.setObservacao(rs.getString("OBSERVACAO").trim());

				produto = new ProdutoBean();
				produto.setCodigo(rs.getLong("IDPROD"));
				produto.setDescricao(rs.getString("DESCRICAO").trim());
				produto.setUnidadeMedida(rs.getString("UNIMEDIDA").trim());
				produto.setMarca(rs.getString("MARCA"));

				itemOrcamento = new ItemOrcamentoBean(produto,
						rs.getDouble("QUANTIDADE"));

				cotacao.setItemOrcamento(itemOrcamento);

				listaCotacoes.add(cotacao);
				if (!rs.next()) {
					orcamento.setCotacoes(listaCotacoes);
					listaOrcamento.add(orcamento);
				} else {
					rs.previous();
				}
			}

		} catch (Exception e) {
			throw e;
		}
		return (List<P>) listaOrcamento;

	}

	/**
	 * USAR PARA BUSCA EM EXCEL
	 * */
	public List<OrcamentoBean> buscaOrcamentosFornecedorRelatorio(
			Map<String, String> param) throws Exception {
		List<OrcamentoBean> orcamentos = new ArrayList<OrcamentoBean>();
		List<CotacaoBean> cotacoes = new ArrayList<CotacaoBean>();
		OrcamentoBean orcamento = null;
		CotacaoBean cotacao = null;
		CompradorBean comprador = null;
		FormaPagamentoBean forma = null;
		ItemOrcamentoBean item = null;
		ProdutoBean produto = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_cotacoes_fornecedor_relatorio");
			ps = conn.prepareStatement(query, ResultSet.CONCUR_UPDATABLE);
			ps.setLong(1, Long.parseLong(param.get("IDFORN")));
			rs = ps.executeQuery();
			while (rs.next()) {
				long idOrca = rs.getLong("IDORCA");
				if (rs.isFirst()) {
					orcamento = new OrcamentoBean();
					comprador = new CompradorBean();
					comprador.setNome(rs.getString("RAZAO"));
					orcamento.setComprador(comprador);
					orcamento.setNumero(rs.getLong("IDORCA"));
				} else {
					rs.previous();
					long idOrcaAnt = rs.getLong("IDORCA");
					rs.next();
					if (idOrca != idOrcaAnt) {
						cotacao = new CotacaoBean();
						forma = new FormaPagamentoBean();
						forma.setMetodoPag(rs.getString("METODO_PAGAMENTO"));
						forma.setFormaPag(rs.getString("FORMA_PAGAMENTO"));
						produto = new ProdutoBean();
						produto.setDescricao(rs.getString("DESCRICAO"));
						item = new ItemOrcamentoBean();
						item.setQuantidade(rs.getDouble("QUANTIDADE"));
						item.setProduto(produto);
						cotacao.setFormaPagamento(forma);
						cotacao.setCodigo(rs.getLong("IDCOTA"));
						cotacao.setValorUnitario(rs.getDouble("VALORUNI"));
						cotacao.setTipoFrete(rs.getString("TIPO_FRETE"));
						cotacao.setObservacao(rs.getString("OBSERVACAO"));
						cotacoes.add(cotacao);
						orcamento.setCotacoes(cotacoes);
						orcamentos.add(orcamento);
						orcamento = new OrcamentoBean();
						comprador = new CompradorBean();
						cotacoes = new ArrayList<CotacaoBean>();
						comprador.setNome(rs.getString("RAZAO"));
						orcamento.setComprador(comprador);
						orcamento.setNumero(rs.getLong("IDORCA"));
					}
				}
				cotacao = new CotacaoBean();
				forma = new FormaPagamentoBean();
				forma.setMetodoPag(rs.getString("METODO_PAGAMENTO"));
				forma.setFormaPag(rs.getString("FORMA_PAGAMENTO"));
				produto = new ProdutoBean();
				produto.setDescricao(rs.getString("DESCRICAO"));
				item = new ItemOrcamentoBean();
				item.setQuantidade(rs.getDouble("QUANTIDADE"));
				item.setProduto(produto);
				cotacao.setFormaPagamento(forma);
				cotacao.setCodigo(rs.getLong("IDCOTA"));
				cotacao.setValorUnitario(rs.getDouble("VALORUNI"));
				cotacao.setTipoFrete(rs.getString("TIPO_FRETE"));
				cotacao.setObservacao(rs.getString("OBSERVACAO"));
				cotacoes.add(cotacao);
				if (rs.isLast()) {
					orcamento.setCotacoes(cotacoes);
					orcamentos.add(orcamento);
				}
			}

		} catch (Exception e) {
			throw e;
		}

		return orcamentos;
	}

	public byte[] imprimeRelatorioOrcamentosFornecedor(String diretorioJasper,
			String diretorioPdf, Map<String, Object> param) throws Exception {
		byte[] bytes = null;
		int psIndex = 1;
		try {

			conn = GerenciadorConexao.getConexao();
			Map<String, Object> params = new HashMap<String, Object>();
			StringBuilder sb = new StringBuilder();
			sb.append(SQLConfiguracao.getInstance().getValor(
					"localiza_relatorio_fornecedor"));

			if (param.get("DATADE") != null) {
				sb.append(" AND O.DTEMISSAO >= ?");
			}
			if (param.get("DATAATE") != null) {
				sb.append(" AND O.DTEMISSAO <= ?");
			}
			if (param.get("CODCOMPRADOR") != null) {
				sb.append(" AND C.IDCOMP = ?");
			}
			if (param.get("CODORCAMENTO") != null
					&& (Long) param.get("CODORCAMENTO") != 0) {
				sb.append(" AND O.IDORCA = ?");
			}
			if (param.get("STATUSORCA") != null
					&& "APROVADO".equals(param.get("STATUSORCA"))) {
				sb.append(" AND IT.IDFORNAPRO IS NOT NULL");
				sb.append(" AND FO.IDFORN = IT.IDFORNAPRO ");
				params.put("STATUS", "Aprovado");
			} else if (param.get("STATUSORCA") != null
					&& "ABERTO".equals(param.get("STATUSORCA"))) {
				sb.append(" AND IT.IDFORNAPRO IS NULL");
				params.put("STATUS", "Aberto");
			} else if (param.get("STATUSORCA") != null
					&& "ENCERRADO".equals(param.get("STATUSORCA"))) {
				sb.append(" AND IT.IDFORNAPRO IS NOT NULL");
				sb.append(" AND FO.IDFORN <> IT.IDFORNAPRO ");
				params.put("STATUS", "Encerrado");
			} else {
				params.put("STATUS", "Todos");
			}

			sb.append(" ORDER BY ");
			sb.append(param.get("ORDEMFILTRO"));
			if (param.get("ORDEMFILTRO").equals("O.DTEMISSAO")) {
				params.put("ORDEM", "Data Emissão");
			} else if (param.get("ORDEMFILTRO").equals("C.RAZAO")) {
				params.put("ORDEM", "Comprador");
			} else {
				params.put("ORDEM", "Orçamento");
			}
			ps = conn.prepareStatement(sb.toString());
			ps.setLong(psIndex++, (Long) param.get("IDFORNE"));
			if (param.get("DATADE") != null && !"".equals(param.get("DATADE"))) {
				ps.setDate(
						psIndex++,
						new Date(((java.util.Date) param.get("DATADE"))
								.getTime()));
				params.put("EMISSAODE", param.get("DATADE"));

			}
			if (param.get("DATAATE") != null
					&& !"".equals(param.get("DATAATE"))) {
				ps.setDate(
						psIndex++,
						new Date(((java.util.Date) param.get("DATAATE"))
								.getTime()));
				params.put("EMISSAOATE", param.get("DATAATE"));
			}
			if (param.get("CODCOMPRADOR") != null
					&& !"".equals(param.get("CODCOMPRADOR"))
					&& !"0".equals(param.get("CODCOMPRADOR"))) {
				ps.setLong(psIndex++,
						((CompradorBean) param.get("CODCOMPRADOR")).getCodigo());
				params.put("COMPRADOR",
						((CompradorBean) param.get("CODCOMPRADOR")).getNome());
			}
			if (param.get("CODORCAMENTO") != null
					&& (Long) param.get("CODORCAMENTO") != 0) {
				ps.setLong(psIndex++, (Long) param.get("CODORCAMENTO"));
				params.put("ORCAMENTO", param.get("CODORCAMENTO"));
			}
			rs = ps.executeQuery();
			JRResultSetDataSource jr = new JRResultSetDataSource(rs);
			JasperPrint print = JasperFillManager.fillReport(diretorioJasper,
					params,
					/* conn */jr);
			JasperExportManager.exportReportToPdfFile(print, diretorioPdf);
			bytes = JasperExportManager.exportReportToPdf(print);

		} catch (Exception e) {

			e.printStackTrace();
		}

		return bytes;

	}

	public byte[] imprimeRelatorioOrcamentosComprador(String diretorioJasper,
			String diretorioPdf, Map<String, Object> param) throws Exception {
		byte[] bytes = null;
		int psIndex = 1;
		try {

			conn = GerenciadorConexao.getConexao();
			Map<String, Object> params = new HashMap<String, Object>();
			StringBuilder sb = new StringBuilder();
			sb.append(SQLConfiguracao.getInstance().getValor(
					"localiza_relatorio_comprador"));

			if (param.get("DATADE") != null) {
				sb.append(" AND O.DTEMISSAO >= ?");
			}
			if (param.get("DATAATE") != null) {
				sb.append(" AND O.DTEMISSAO <= ?");
			}
			if (param.get("IDFORNE") != null) {
				sb.append(" AND FO.IDFORN = ?");
			}
			if (param.get("CODORCAMENTO") != null
					&& (Long) param.get("CODORCAMENTO") != 0) {
				sb.append(" AND O.IDORCA = ?");
			}
			if (param.get("PRODFILTRO") != null) {
				sb.append(" AND IT.IDPROD = ?");
			}

			if (param.get("STATUSORCA") != null
					&& "APROVADO".equals(param.get("STATUSORCA"))) {
				sb.append(" AND IT.IDFORNAPRO IS NOT NULL");
				params.put("STATUS", "Aprovado");
			} else if (param.get("STATUSORCA") != null
					&& "ABERTO".equals(param.get("STATUSORCA"))) {
				sb.append(" AND IT.IDFORNAPRO IS NULL");
				params.put("STATUS", "Aberto");
			} else if (param.get("STATUSORCA") != null
					&& "ENCERRADO".equals(param.get("STATUSORCA"))) {
				sb.append(" AND IT.IDFORNAPRO IS NOT NULL");
				sb.append(" AND FO.IDFORN <> IT.IDFORNAPRO ");
				params.put("STATUS", "Encerrado");
			}else{
				params.put("STATUS", "Todos");
			}

			sb.append(" ORDER BY ");
			sb.append(param.get("ORDEMFILTRO"));
			if (param.get("ORDEMFILTRO").equals("O.DTEMISSAO")) {
				params.put("ORDEM", "Data Emissão");
			} else if (param.get("ORDEMFILTRO").equals("FO.RAZAO")) {
				params.put("ORDEM", "Fornecedor");
			} else {
				params.put("ORDEM", "Orçamento");
			}

			ps = conn.prepareStatement(sb.toString());

			ps.setLong(psIndex++,
					((CompradorBean) param.get("CODCOMPRADOR")).getCodigo());
			if (param.get("DATADE") != null) {
				ps.setDate(
						psIndex++,
						new Date(((java.util.Date) param.get("DATADE"))
								.getTime()));
				params.put("EMISSAODE", param.get("DATADE"));
			}
			if (param.get("DATAATE") != null) {
				ps.setDate(
						psIndex++,
						new Date(((java.util.Date) param.get("DATAATE"))
								.getTime()));
				params.put("EMISSAOATE", param.get("DATAATE"));
			}
			if (param.get("IDFORNE") != null) {
				ps.setLong(psIndex++,
						((FornecedorBean) param.get("IDFORNE")).getCodigo());
				params.put("FORNECEDOR",
						((FornecedorBean) param.get("IDFORNE")).getNome());
			}
			if (param.get("CODORCAMENTO") != null
					&& (Long) param.get("CODORCAMENTO") != 0) {
				ps.setLong(psIndex++, (Long) param.get("CODORCAMENTO"));
				params.put("ORCAMENTO", param.get("CODORCAMENTO"));
			}
			if (param.get("PRODFILTRO") != null) {
				ps.setLong(psIndex++,
						((ProdutoBean) param.get("PRODFILTRO")).getCodigo());
				params.put("PRODUTO",
						((ProdutoBean) param.get("PRODFILTRO")).getDescricao());
			}
			rs = ps.executeQuery();
			JRResultSetDataSource jr = new JRResultSetDataSource(rs);
			JasperPrint print = JasperFillManager.fillReport(diretorioJasper,
					params, jr);
			JasperExportManager.exportReportToPdfFile(print, diretorioPdf);
			bytes = JasperExportManager.exportReportToPdf(print);

		} catch (Exception e) {

			e.printStackTrace();
		}

		return bytes;

	}
}
